﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using DECOR.BL.BE;
using DECOR.BL.BC;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace DECOR.WebApp
{
    public partial class DocImpr : System.Web.UI.Page
    {
        public List<DetalleBE> lstDetalle = new List<DetalleBE>();
        string tipoMoneda = "";
        protected void Page_Init(object sender, EventArgs e)
        {
            //this.validaLogin();
        }

        private void validaLogin()
        {
            //if (Session["UsuarioWeb"] == null || Session["UsuarioSAP"] == null)
            //{
            //    Response.Redirect("Login.aspx");
            //    //en vez de redireccionar, debería cerrar la pantalla
            //}
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                string numeroPedido = "";
                if (Request.QueryString["np"] != null)
                {
                    numeroPedido = Request.QueryString["np"].ToString();
                }

                if (!numeroPedido.Equals(""))
                {
                    PedidoBE objPedido;
                    if (Session["PedidoImpr"] == null)
                    {
                        objPedido = PedidoBC.Instance.leer(numeroPedido);
                    }
                    else
                    {
                        objPedido = (PedidoBE)Session["PedidoImpr"];
                    }

                    if (objPedido != null)
                    {
                        string pDireccion = "", pTelefono = "", pFax = "", pAtencion = "";
                        PedidoBC.Instance.buscaDatosImpresion(numeroPedido, out pDireccion, out pTelefono, out pFax, out pAtencion);
                        lblDireccionLogo.Text = pDireccion;
                        
                        //sociedad Decor Center 
                        string[] words = pTelefono.Split('%');
                        pTelefono = words[0];
                        lblSociedad.Text = "DECOR CENTER";
                        lblSociedadtxt.Text = words[1];
                        //------------------------------------------
                        lblTelefonosLogo.Text = pTelefono + (pFax == "" ? "" : ", " + pFax);
                       
                        lblAtt.Text = pAtencion;
                        CargarJerarquiasAgrupadas(objPedido.Detalle, objPedido.Moneda);
                        InterlocutorBE objSolicitanteVende = objPedido.Interlocutores.Find(delegate(InterlocutorBE ilctr) { return (ilctr.Funcion == ParametroBC.Instance.getParamValue("IlocVendedor1")); });
                        if (objSolicitanteVende == null)
                        {
                            objSolicitanteVende = objPedido.Interlocutores.Find(delegate(InterlocutorBE ilctr) { return (ilctr.Funcion == ParametroBC.Instance.getParamValue("IlocVendedor2")); });
                            if (objSolicitanteVende == null)
                            {
                                objSolicitanteVende = objPedido.Interlocutores.Find(delegate(InterlocutorBE ilctr) { return (ilctr.Funcion == ParametroBC.Instance.getParamValue("IlocVendedor3")); });
                                if (objSolicitanteVende == null)
                                {
                                    throw new Exception("No se encontró información del encargado comercial.");
                                }
                            }
                        }
                        GenericBE objCondPago = CondicionPagoBC.Instance.leer(objPedido.CondPago);
                        if (objCondPago != null)
                        {
                            lblCondpago.Text = objCondPago.Descripcion.Replace("::", "");
                        }

                        if (objSolicitanteVende.Persona != null)
                        {
                            PersonaBE objVendedor = PersonaBC.Instance.leer(objSolicitanteVende.Persona.CodPersona);
                            if (objVendedor != null) { lblVendedor.Text = objVendedor.Descripcion; }
                        }
                        lblFecha.Text = objPedido.Fecha.ToShortDateString();


                        //-- validar si es un cliente eventual:
                        ClienteBE objCliente = ClienteBC.Instance.leer(objPedido.CodCliente);
                        if (objCliente.Eventual)//si es eventual
                        {
                            InterlocutorBE objSolicitante = objPedido.Interlocutores.Find(delegate(InterlocutorBE ilctr) { return (ilctr.Funcion == ParametroBC.Instance.getParamValue("IlocCliente")); });
                            if (objSolicitante != null && objSolicitante.Cliente != null)
                            {
                                lblCliente.Text = objSolicitante.Cliente.Descripcion.ToString();
                                lblDirecc.Text = objSolicitante.Cliente.DireccionCompleta.ToString();
                                lblRuc.Text = objSolicitante.Cliente.Ruc.ToString();
                                lblTelef.Text = objSolicitante.Cliente.Telefono.ToString();
                            }
                        }
                        else
                        {
                            //ClienteBE objCliente = ClienteBC.Instance.leer(objPedido.CodCliente, numeroPedido);
                            lblCliente.Text = objCliente.Descripcion;
                            lblDirecc.Text = objCliente.DireccionCompleta;
                            lblRuc.Text = objCliente.Ruc;
                            lblTelef.Text = objCliente.Telefono;
                        }

                        if (ParametroBC.Instance.esTipoOferta(objPedido.CodTipoDoc) && (!objPedido.CodTipoDoc.Equals("Z004")))
                        {
                            lblCoti.Text = "COTIZACIÓN N° ";
                        }
                        else
                        {
                            lblCoti.Text = "N° PEDIDO VENTA ";
                        }

                        lblCotiza.Text = objPedido.NumPedido;
                        var filtro_igv = 0m;
                        var filtro_per = 0m;
                        if (objPedido != null || objPedido.Detalle != null)
                        {
                            //no se considera los motivos de rechazo z5 y z4.
                            filtro_igv = (from c in objPedido.Detalle where c.MotivoRechazo != "Z5" && c.MotivoRechazo != "Z4" select c.Igv.Valor).Sum();
                            filtro_per = objPedido.Percepcion;
                        }
                        else
                        {
                            filtro_igv = 0;
                        }
                        
                        lblValor.Text = ParametroBC.Instance.getParamValue(objPedido.Moneda) + " " + string.Format("{0:n2}", objPedido.SubtotalImp);
                        lblIgv.Text = string.Format("{0:n2}", (decimal)filtro_igv); //objPedido.Igv);
                        lblTotal.Text = ParametroBC.Instance.getParamValue(objPedido.Moneda) + " " + string.Format("{0:n2}", objPedido.SubtotalImp + filtro_igv + filtro_per);//objPedido.TotalImp);
                        lblPerc.Text = string.Format("{0:n2}", (decimal)filtro_per);
                        //si es un pedido de transporte cambia cantidad x pesoneto
                        //if (objPedido.CodTipoDoc.Equals(ParametroBC.Instance.getParamValue("CodTransporte")))
                        //{
                        //    foreach (DetalleBE objDetalle in objPedido.Detalle)
                        //    {
                        //        //objDetalle.Peso = objDetalle.Cantidad;
                        //        //objDetalle.Cantidad = 1m;
                        //    }
                        //}

                        //--- quitar componentes de la oferta
                        objPedido.Detalle.RemoveAll(X => X.TipoPosicion == "Z017");
                        objPedido.Detalle.RemoveAll(X => X.TipoPosicion == "Z012");

                        if (!ParametroBC.Instance.esTipoOferta(objPedido.CodTipoDoc))
                        {
                            string strAux;
                            foreach (DetalleBE objItem in objPedido.Detalle)
                            {
                                if (!string.IsNullOrEmpty(objItem.CodLote))
                                {
                                    strAux = "";
                                    List<GenericBE> lstLotes = StockBC.Instance.listarLotes(objItem.CodMaterial, objItem.CodCentro, objItem.CodAlmacen, objItem.Cantidad, objPedido.NumPedido, out strAux);
                                    GenericBE itmLote = lstLotes.Find(X => X.Codigo == objItem.CodLote);

                                    if (itmLote != null && !string.IsNullOrEmpty(itmLote.Codigo))
                                    {
                                        strAux = itmLote.Descripcion;
                                        strAux = strAux.IndexOf('-') >= 0 ? strAux.Substring(strAux.IndexOf('-')) : "";
                                        objItem.DescMaterial += " " + strAux;
                                        objItem.DescMaterial = objItem.DescMaterial.Trim();
                                    }
                                }
                            }
                        }

                        GdvLista.DataSource = objPedido.Detalle;
                        GdvLista.DataBind();

                        if (objPedido.BonoCampania.Count > 0)
                        {
                            gdvBonos.DataSource = objPedido.BonoCampania;
                            gdvBonos.DataBind();
                        }

                        //RGF 20111028
                        if (objPedido.RegaloCampania.Count > 0)
                        {
                            gdvRegalos.DataSource = objPedido.RegaloCampania;
                            gdvRegalos.DataBind();
                        }

                        //rgutierrez 27.01.2012
                        List<GlosaBE> glosas = PedidoBC.Instance.glosasCotizacion(objPedido.NumPedido);
                        
                        GdvGlosa.DataSource = glosas;
                        GdvGlosa.DataBind();
                        //RGF 20111027
                        List<InstalaBE> lstDetalle = (List<InstalaBE>) Session["listadoInstalacion"];
                        if (lstDetalle == null || lstDetalle.Count <= 0)
                        {
                            lstDetalle = PedidoBC.Instance.listadoInstalacion(objPedido.NumPedido);
                        }
                        
                        if (lstDetalle != null)
                        {
                            if (lstDetalle.Count > 0)
                            {
                                decimal igv = objPedido.Detalle[0].Igv.Importe / 10; //RGF 11.11.2011

                                string script = "<script type='text/javascript'>" + 
                                    " window.open('DocImprInst.aspx?np=" + objPedido.NumPedido + "&vIGV=" + igv.ToString() + "','','width=800,height=600,top=50,left=250,status=no,resizable=no,scrollbars=yes','true'); " +
                                    "</script>";
                                ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "IMPRIMIR__2", script, false);
                            }
                        }
                    }
                    else
                    {
                        throw new Exception("No se encontró el doc. de ventas.");
                    }
                }
                else
                {
                    throw new Exception("No se especificó el doc. de ventas.");
                }
            }
            catch (Exception ex)
            {
                Response.Write("<h4>No se puede mostrar la información.<br />Error: " + ex.Message + "</h4>");
                Page.Visible = false;
            }
        }

        protected void btnDocImprInst_Click(object sender, ImageClickEventArgs e) {

            string numeroPedido = "";
            if (Request.QueryString["np"] != null)
            {
                numeroPedido = Request.QueryString["np"].ToString();
            }
            string str = string.Format("<script type='text/javascript'>" +
                //               " window.open('{0}?np={1}','','width=800,height=600,top=50,left=150,status=no,resizable=no,scrollbars=yes','true'); " +
                   " window.open('{0}?np={1}','','width=800,height=600,top=50,left=250,status=no,resizable=no,scrollbars=yes','true'); " +

                               "</script>"
                           , "DocImprInst.aspx", numeroPedido);
            ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "IMPRIMIR", str, false);
        }

        protected void gdvRegalos_DataBound(object sender, EventArgs e)
        {
            try
            {
                gdvRegalos.Columns[2].Visible = false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        decimal totalGeneral = 0m;
        //cargamos las jerarquia agrupadas
        private void CargarJerarquiasAgrupadas(List<DetalleBE> listDet, string _tipoMoneda)
        {
            List<JerarquiasAgrupadas> lstJ = new List<JerarquiasAgrupadas>();
            JerarquiasAgrupadas objJ = new JerarquiasAgrupadas();

            var q = from b in listDet
                group b by b.JerarquiaPrincipalDesc into g
                select new
                {
                    Descripcion = g.Key,
                    Total = g.Sum(item => item.SubTotal)
                };

            foreach (var item in q)
            {
                objJ = new JerarquiasAgrupadas();
                objJ.desJerarquia = item.Descripcion;
                objJ.total = item.Total;
                objJ.totalTexto = ParametroBC.Instance.getParamValue(_tipoMoneda) + " " + string.Format("{0:n2}", item.Total);
                totalGeneral += item.Total;
                lstJ.Add(objJ);
            }
            tipoMoneda = _tipoMoneda;
            //GridViewJerarquiaMaterial.DataSource = lstJ;
            //GridViewJerarquiaMaterial.DataBind();
        }

        //protected void GridViewJerarquiaMaterial_RowDataBound(object sender, GridViewRowEventArgs e)
        //{
        //    if (e.Row.RowType == DataControlRowType.Footer)
        //    {
        //        e.Row.Cells[1].Text = ParametroBC.Instance.getParamValue(tipoMoneda) + " " + String.Format("{0:n2}", totalGeneral);
        //    }
        //}

        
    }

}

internal class JerarquiasAgrupadas
{
    public string desJerarquia { get; set; }
    public decimal total { get; set; }
    public string totalTexto { get; set; }
}
